package com.priox.sigar.application.cliente;

import com.mm.support.mapper.DTOMapperService;
import com.priox.sigar.application.mappers.ClienteMapper;
import com.priox.sigar.client.dto.ClienteDTO;
import com.priox.sigar.client.dto.ClienteSociedadDTO;
import com.priox.sigar.client.dto.SociedadDTO;
import com.priox.sigar.domain.model.*;
import com.priox.sigar.server.infrastructure.persistence.exception.ApplicationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

@Component
public class RegistroClienteAppImpl implements RegistroClienteApp {

    @Autowired
    DTOMapperService mapperService;

    @Autowired
    ClienteRepository clienteRepository;

    @Autowired
    SociedadRepository sociedadRepository;

    @Autowired
    ClienteMapper clienteMapper;




    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void save(Cliente cliente,List<ClienteSociedad> clienteSociedad, boolean updateMode) {

        clienteMapper.deleteSociedadByCliente(cliente.getClienteId());
        if (updateMode) {
            clienteRepository.merge(cliente);
        } else {
            Integer cont = clienteMapper.existeCuentaId(cliente.getClienteId());
            if (cont!=null && cont > 0) {
                throw new ApplicationException("El cliente '" + cliente.getClienteId() + "' ya esta registrada");
            }
            clienteRepository.persist(cliente);
        }
        for (Iterator iterator = clienteSociedad.iterator(); iterator.hasNext(); ) {
            ClienteSociedad next = (ClienteSociedad)iterator.next();
            next.setClienteId(cliente.getClienteId());
            clienteRepository.persistSociedades(next);
        }

    }

    public void deleteAll() {
        clienteMapper.deleteAll();
    }

    public List<SociedadDTO> findByIdList(List<String> seleccionados) {
        List<Sociedad> sociedadList = sociedadRepository.findByIds(seleccionados);
        List<SociedadDTO> result = new ArrayList<SociedadDTO>();
        for (Sociedad sociedad : sociedadList) {
            result.add(mapperService.map(sociedad, SociedadDTO.class));
        }
        return result;
    }

    public ClienteDTO findById(String clienteId) {
        ClienteDTO cliente = clienteMapper.findByClienteId(clienteId);
        List<ClienteSociedadDTO> clienteSociedad=clienteRepository.obtenerClienteSociedadList(clienteId);
        cliente.setClienteSociedad(clienteSociedad);
        return cliente;
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void delete(Cliente cliente) {
       clienteRepository.remove(cliente);
    }
}
